package com.itec.learn.java.threadpool;

import java.util.concurrent.*;

/**
 * @author chenyiqun
 */
public class ThreadPoolTest {

    /*
    *
    * newFixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的，它使用的LinkedBlockingQueue；
　　  newSingleThreadExecutor将corePoolSize和maximumPoolSize都设置为1，也使用的LinkedBlockingQueue；
　　  newCachedThreadPool将corePoolSize设置为0，将maximumPoolSize设置为Integer.MAX_VALUE，使用的SynchronousQueue，
     也就是说来了任务就创建线程运行，当线程空闲超过60秒，就销毁线程。
    * */
    public static void main(String[] args) {

        //LinkedBlockingQueue 基于链表的先进先出队列，如果创建时没有指定此队列大小，则默认为Integer.MAX_VALUE
        //就是说这个任务队列可以无限大
        ExecutorService executorService = Executors.newCachedThreadPool();
//                Executors.newFixedThreadPool(5);
        ThreadPoolExecutor executor = (ThreadPoolExecutor)executorService;

        //最大8（6+2）个任务，超出的任务直接拒绝，抛出异常
//        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 6, 200, TimeUnit.MILLISECONDS,
//                new ArrayBlockingQueue<Runnable>(2));
        try {

            for (int i = 0; i < 20; i++) {
                MyTask myTask = new MyTask(i);
                executor.execute(myTask);
                System.out.println(
                        "线程池中线程数目："+executor.getPoolSize()+
                                "，队列中等待执行的任务数目："+executor.getQueue().size()+
                                "，已执行玩别的任务数目："+executor.getCompletedTaskCount());
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            executor.shutdown();
        }
    }
}

class MyTask implements Runnable{

    private int taskNum;

    public MyTask(int taskNum){
        this.taskNum = taskNum;
    }

    @Override
    public void run() {
        System.out.println("正在执行task "+taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task "+taskNum+" 执行完毕");
    }
}
